export const isvalidPhone = (str) => /^1\d{10}$/.test(str)
export const required = {
  required: true,
  message: '必填项',
  trigger: 'blur'  
}

export const mobileValidator = (rule, value, callback) => {
  if (!/^1\d{10}$/.test(value)) {
    callback(new Error('手机号格式有误'))
  } else {
    callback()
  }
}

export const emailValidator = (rule, value, callback) => {
  if (!/^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/.test(value)) {
    callback(new Error('邮箱格式有误'));
  } else {
    callback();
  }
}


// 6-24位长度任意字符
export const passwordValidator = (rule, value, callback) => {
  if (!/^.{6,24}$/.test(value)) {
    callback(new Error('邮箱格式有误'));
  } else {
    callback();
  }
}


// 6+位长度 数字 + 字母
export const passwordNumberAndLetterValidator = (rule, value, callback) => {
  if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d]{6,}$/.test(value)) {
    callback(new Error('请输入至少6位，且包含大小写字母和数字'));
  } else {
    callback();
  }
}

// 传真电话
export const faxValidator = (rule, value, callback) => {
  if (!/^\d{1,5}([-]?\d{1,32})+$/.test(value)) { 
    callback(new Error('请输入正确的传真/电话'));
  } else {
    callback();
  }
}

// 不包含数字
export const noNumberValidator = (rule, value, callback) => {
  const hasNumber = /\d/.test(value); // 使用正则表达式检测值中是否包含数字
  if (hasNumber) {
    callback(new Error('不能包含数字'));
  } else {
    callback(); // 如果没有数字，则验证通过
  }
};

export const onOffRequiredValidator = {
  pattern: /true/,
  message: '必选项',
  trigger: 'change'
}
export const positiveIntegerValidator = {
  pattern: /^[1-9][0-9]*$/g,
  message: '大于0的正整数',
  trigger: 'blur'
}
// 二代身份证校验
export const validateSecIdCard = (rule, value, callback) => {
  if (!value) { callback(new Error('请输入身份证')) }
  var iSum = 0
  var sId = value
  var aCity = {
    11: '北京',
    12: '天津',
    13: '河北',
    14: '山西',
    15: '内蒙',
    21: '辽宁',
    22: '吉林',
    23: '黑龙',
    31: '上海',
    32: '江苏',
    33: '浙江',
    34: '安徽',
    35: '福建',
    36: '江西',
    37: '山东',
    41: '河南',
    42: '湖北',
    43: '湖南',
    44: '广东',
    45: '广西',
    46: '海南',
    50: '重庆',
    51: '四川',
    52: '贵州',
    53: '云南',
    54: '西藏',
    61: '陕西',
    62: '甘肃',
    63: '青海',
    64: '宁夏',
    65: '新疆',
    71: '台湾',
    81: '香港',
    82: '澳门',
    83: '台湾',
    91: '国外'
  }
  if (!/^\d{17}(\d|x)$/i.test(sId)) {
    callback(new Error('身份证格式错误'))
  }
  sId = sId.replace(/x$/i, 'a')
  // 非法地区
  if (aCity[parseInt(sId.substr(0, 2))] === null) {
    callback(new Error('身份证格式错误'))
  }
  var sBirthday = sId.substr(6, 4) + '-' + Number(sId.substr(10, 2)) +
    '-' + Number(sId.substr(12, 2))
  var d = new Date(sBirthday.replace(/-/g, '/'))
  // 非法生日
  if (sBirthday !== d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d
    .getDate()) {
      callback(new Error('身份证格式错误'))
  }
  for (let i = 17; i >= 0; i--) {
    iSum += Math.pow(2, i) % 11 * parseInt(sId.charAt(17 - i), 11)
  }
  if (iSum % 11 !== 1) {
    callback(new Error('身份证格式错误'))
  }
  callback()
}
// export function validateSecIdCard (value) {
//   if (!value) { return true }
//   var iSum = 0
//   var sId = value
//   var aCity = {
//     11: '北京',
//     12: '天津',
//     13: '河北',
//     14: '山西',
//     15: '内蒙',
//     21: '辽宁',
//     22: '吉林',
//     23: '黑龙',
//     31: '上海',
//     32: '江苏',
//     33: '浙江',
//     34: '安徽',
//     35: '福建',
//     36: '江西',
//     37: '山东',
//     41: '河南',
//     42: '湖北',
//     43: '湖南',
//     44: '广东',
//     45: '广西',
//     46: '海南',
//     50: '重庆',
//     51: '四川',
//     52: '贵州',
//     53: '云南',
//     54: '西藏',
//     61: '陕西',
//     62: '甘肃',
//     63: '青海',
//     64: '宁夏',
//     65: '新疆',
//     71: '台湾',
//     81: '香港',
//     82: '澳门',
//     83: '台湾',
//     91: '国外'
//   }
//   if (!/^\d{17}(\d|x)$/i.test(sId)) {
//     return false
//   }
//   sId = sId.replace(/x$/i, 'a')
//   // 非法地区
//   if (aCity[parseInt(sId.substr(0, 2))] === null) {
//     return false
//   }
//   var sBirthday = sId.substr(6, 4) + '-' + Number(sId.substr(10, 2)) +
//     '-' + Number(sId.substr(12, 2))
//   var d = new Date(sBirthday.replace(/-/g, '/'))
//   // 非法生日
//   if (sBirthday !== d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d
//     .getDate()) {
//     return false
//   }
//   for (let i = 17; i >= 0; i--) {
//     iSum += Math.pow(2, i) % 11 * parseInt(sId.charAt(17 - i), 11)
//   }
//   if (iSum % 11 !== 1) {
//     return false
//   }
//   return true
// }
export const CertificateTypeValidator = {
  '1': {
    // pattern: /^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/,
    message: '二代身份证格式不正确',
    pattern: {
      test (value) {
        return validateSecIdCard(value)
      }
    }
  },
  '2': {
    pattern: /^[a-zA-Z0-9]{5,17}$/,
    message: '护照格式不正确'
  },
  '4': {
    pattern: {
      test (value) {
        return validateSecIdCard(value)
      }
    },
    message: '港澳台居住证格式不正确'
  },
  '16': {
    pattern: /^[HMhm]{1}([0-9]{8})$/,
    message: '港澳居民来往内地通行证格式不正确'
  },
  '64': {
    pattern: /^[0-9]{8}$/,
    message: '台湾居民来往大陆通行证格式不正确'
  },
  '128': {
    pattern: /^[a-zA-Z0-9]{7,21}$/,
    message: '军官证格式不正确'
  },
  '256': {
    pattern: /^[a-zA-Z]{3}[0-9]{12}$/,
    message: '外国人永久居留身份证 格式不正确'
  }
}
// 最小长度
export function minLengthValidator(minLength) {
  return (value) => {
    if (typeof value === 'string' && value.length >= minLength) {
      return true;
    }
    return new Error(`输入长度至少为 ${minLength} 个字符`);
  }
}
// 最大长度
export function maxLengthValidator(maxLength) {
  return (value) => {
    if (typeof value === 'string' && value.length <= maxLength) {
      return true;
    }
    return new Error(`输入长度至多为 ${maxLength} 个字符`);
  }
}
// 通用的正则表达式验证函数
export function regexValidator(regex, message = '格式不正确') {
  return (value) => {
    if (typeof value === 'string' && regex.test(value)) {
      return true;
    }
    return new Error(message);
  };
}
// URL 验证
export function urlValidator(rule, value, callback) {
  const urlRegex = /^(http|https):\/\/[^ "]+$/;
  if (!urlRegex.test(value)) { 
    callback(new Error('请输入有效的网址'));
  } else {
    callback();
  }
}
// 整数验证函数
// export function integerValidator(message = '请输入有效的整数') {
//   const intRegex = /^-?\d+$/;
//   return (value) => {
//     if (typeof value === 'string' && intRegex.test(value)) {
//       return true;
//     }
//     return new Error(message);
//   };
// }
export const integerValidator = (rule, value, callback) => {
  const intRegex = /^-?\d+$/;
  if (!intRegex.test(value)) { 
    callback(new Error('请输入有效的整数'));
  } else {
    callback();
  }
}
// 小数验证函数
// export function decimalValidator(message = '请输入有效的小数') {
//   const floatRegex = /^-?\d+(\.\d+)?$/;
//   return (value) => {
//     if (typeof value === 'string' && floatRegex.test(value)) {
//       return true;
//     }
//     return new Error(message);
//   };
// }
export const decimalValidator = (rule, value, callback) => {
  const floatRegex = /^-?\d+(\.\d+)?$/;
  if (!floatRegex.test(value)) { 
    callback(new Error('请输入有效的小数'));
  } else {
    callback();
  }
}
export const validateRules = {
  mobileValidator,
  emailValidator,
  passwordValidator,
  faxValidator,
  noNumberValidator,
  onOffRequiredValidator,
  positiveIntegerValidator,
  passwordNumberAndLetterValidator,
  CertificateTypeValidator,
  minLengthValidator,
  maxLengthValidator,
  regexValidator,
  urlValidator,
  integerValidator,
  decimalValidator
}
